head(B)
##      crim zn indus chas   nox    rm  age    dis rad tax ptratio  black
## 1 0.00632 18  2.31    0 0.538 6.575 65.2 4.0900   1 296    15.3 396.90
## 2 0.02731  0  7.07    0 0.469 6.421 78.9 4.9671   2 242    17.8 396.90
## 3 0.02729  0  7.07    0 0.469 7.185 61.1 4.9671   2 242    17.8 392.83
## 4 0.03237  0  2.18    0 0.458 6.998 45.8 6.0622   3 222    18.7 394.63
## 5 0.06905  0  2.18    0 0.458 7.147 54.2 6.0622   3 222    18.7 396.90
## 6 0.02985  0  2.18    0 0.458 6.430 58.7 6.0622   3 222    18.7 394.12
##   lstat medv
## 1  4.98 24.0
## 2  9.14 21.6
## 3  4.03 34.7
## 4  2.94 33.4
## 5  5.33 36.2
## 6  5.21 28.7

Посмотрим на распределения

Удалим те признаки, у которых распределения совсем неприятные:

interest1 = c('crim', 'zn', 'indus', 'nox', 'rm', 'age', 'dis', 'rad', 'lstat', 'medv')

Прологарифмируем несимметричные распределения и отберём ещё поменьше признаков:

B$logCrim <- log(B$crim);
B$logNox <- log(B$nox);
B$logRm <- log(B$rm);
B$logMedv <- log(B$medv);
B$logLstat <- log(B$lstat);
B$logDis <- log(B$dis)
interest2 <- c('logCrim', 'zn', 'indus', 'logNox', 'logRm', 'age', 'logDis', 'rad', 'logLstat', 'logMedv')

Посмотрим на общий график:

Более крупно самую интересную часть:

Видим, что данные линейно разделимы. Разделим их по тем прямым, по которым их визуально хочется разделить, и проверим наше деление:

B$group <- (B$indus < (-2.5 * B$logCrim + 15)) & (B$rad < 20)
splom(B[,interest2], group=B$group)

BG <- B[B$group,];

В наибольшей группе попытаемся предсказать среднюю стоимость дома по всем остальным переменным:

model0 <- lm(logMedv ~ zn+indus+age+rad+logCrim+logNox+logRm+logLstat+logDis, data = BG)
summary(model0)
## 
## Call:
## lm(formula = logMedv ~ zn + indus + age + rad + logCrim + logNox + 
##     logRm + logLstat + logDis, data = BG)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.51966 -0.07085 -0.00929  0.06464  0.43254 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -0.2229862  0.2738915  -0.814 0.416196    
## zn           0.0003048  0.0003652   0.835 0.404565    
## indus       -0.0100516  0.0026999  -3.723 0.000234 ***
## age         -0.0028265  0.0004197  -6.735 8.07e-11 ***
## rad          0.0111145  0.0043084   2.580 0.010353 *  
## logCrim     -0.0050256  0.0087085  -0.577 0.564300    
## logNox      -0.2216700  0.1124449  -1.971 0.049580 *  
## logRm        2.0677367  0.1218459  16.970  < 2e-16 ***
## logLstat    -0.0406798  0.0263960  -1.541 0.124314    
## logDis      -0.2326219  0.0294169  -7.908 4.77e-14 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1195 on 307 degrees of freedom
## Multiple R-squared:  0.8316, Adjusted R-squared:  0.8266 
## F-statistic: 168.4 on 9 and 307 DF,  p-value: < 2.2e-16

Уберём наименее значимые признаки:

model1 <-lm(logMedv ~ logNox+logRm+logDis+logLstat, data = BG);
summary(model1);
## 
## Call:
## lm(formula = logMedv ~ logNox + logRm + logDis + logLstat, data = BG)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.62598 -0.07694 -0.00325  0.07367  0.44901 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -0.10596    0.27779  -0.381    0.703    
## logNox      -0.45349    0.10720  -4.230 3.07e-05 ***
## logRm        1.89810    0.11760  16.140  < 2e-16 ***
## logDis      -0.16732    0.03020  -5.541 6.40e-08 ***
## logLstat    -0.14573    0.02384  -6.112 2.94e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1307 on 312 degrees of freedom
## Multiple R-squared:  0.7953, Adjusted R-squared:  0.7926 
## F-statistic:   303 on 4 and 312 DF,  p-value: < 2.2e-16

nox – концентрация оксидов азота в атмосфере

rm – среднее число комнат в строении

dis – средневзвешенное расстояние от пяти бостонских центров трудоустройства

lstat – процент бедного населения

Всё логично.

Посмотрим на качество предсказаний модели. График ошибок предсказания против предсказанных значений должен быть “равномерным”, график квантиль-квантиль стандартизованных остатков должен быть похож на прямую, график сдвига-масштаба – то же самое, что и residuals vs. fitted, только с стандартизованными остатками, тоже должен быть равномерным и не выезжать за пределы, приличные для нормального распределения. График влиятельности на остатки должен быть кучным.

plot(model1)